<?php
class payAction extends Action {

    public function warning(){
    	echo "success";
    }
    
    public function notify(){
    	 vendor('WxPay/WxPayPubHelper');
    	 //使用通用通知接口
    	 $notify = new Notify_pub();
    	 //存储微信的回调
    	 $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    	 $notify->saveData($xml);
    	 //验证签名，并回应微信。
    	 //对后台通知交互时，如果微信收到商户的应答不是成功或超时，微信认为通知失败，
    	 //微信会通过一定的策略（如30分钟共8次）定期重新发起通知，
    	 //尽可能提高通知的成功率，但微信不保证通知最终能成功。
    	 if($notify->checkSign() == FALSE){
    	 	$notify->setReturnParameter("return_code","FAIL");//返回状态码
    	 	$notify->setReturnParameter("return_msg","签名失败");//返回信息
    	 }else{
    	 	$notify->setReturnParameter("return_code","SUCCESS");//设置返回码
    	 }
    	 $returnXml = $notify->returnXml();
    	 echo $returnXml;
    	 //==商户根据实际情况设置相应的处理流程，此处仅作举例=======
    	 //以log文件形式记录回调信息
    	 $log_name="./notify_url.log";//log文件路径
    	 $this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");
    	 if($notify->checkSign() == TRUE)
    	 {
    	 	if ($notify->data["return_code"] == "FAIL") {
    	 		//此处应该更新一下订单状态，商户自行增删操作
    	 		$log_->log_result($log_name,"【通信出错】:\n".$xml."\n");
    	 	}elseif($notify->data["result_code"] == "FAIL"){
    	 		//此处应该更新一下订单状态，商户自行增删操作
    	 		$log_->log_result($log_name,"【业务出错】:\n".$xml."\n");
    	 	}else{
    	 		$Pay = $notify->xmlToArray($xml);
    	 		$R = M("order");
    	 		$condition['order_num'] = $Pay['out_trade_no'];
    	 		$Info = $R->join('hx_user u on hx_order.user_id=u.user_id')->field('u.open_id,hx_order.*')->where($condition)->find();
    			if($Info['open_id']){
                    log::write("支付推送2 pay_notify");
    				$url = 'http://wechat.99qby.com/app/index.php?i=4&c=entry&do=index2&m=we7_demo&open_id='.$Info['open_id'].'&type=3&num='.$Info['order_num'].'&id='.$Info['order_id'].'&money='.$Info['all_price'].'&money='.$Info['all_price'];
    				$this->https_request($url);
    			}
    	 		$datamoney['order_id'] = $Info['order_id'];
    	 		$datamoney['pay_type'] = 2;
    	 		$res = $R->save($datamoney);
    	 		/* //支付日志
    	 		$tdata['order_id'] = $Info['order_id'];
    	 		$tdata['action'] = 'PAY';
    	 		$tdata['name'] = '用户支付';
    	 		$tdata['time'] = time();
    	 		M('order_log')->add($tdata); */
    	 		//未激活免单 激活
    	 		$mianDan = M('coupon_user')->where('c_id=4 and status=2 and user_id='.$Info['user_id'])->find();
    	 		if($mianDan){
    	 			$Dan['id'] = $mianDan['id'];
    	 			$Dan['status'] = 1;
    	 			$Dan['rand_money'] = $Info['all_price'];
    	 			M('coupon_user')->save($Dan);
    	 		}
    	 	}
    	 	//商户自行增加处理流程,
    	 	//例如：更新订单状态
    	 	//例如：数据库操作
    	 	//例如：推送支付完成信息
    	 }
    }
    
    // 打印log
    public function log_result($file,$word)
    {
    	$fp = fopen($file,"a");
    	flock($fp, LOCK_EX) ;
    	fwrite($fp,"执行日期：".strftime("%Y-%m-%d-%H：%M：%S",time())."\n".$word."\n\n");
    	flock($fp, LOCK_UN);
    	fclose($fp);
    }
    
    //支付宝支付通知
    public function alipay_notify()
    {
    	vendor('alipay/alipay_core');
    	vendor('alipay/alipay_md5');
    	vendor('alipay/alipay_notify');
    	$alipay_config = $this->alipayConfig();
    	//计算得出通知验证结果
    	$alipayNotify = new AlipayNotify($alipay_config);
    	$verify_result = $alipayNotify->verifyNotify();
    	if($verify_result) {//验证成功
    		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    		//请在这里加上商户的业务逻辑程序代
    		//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
    		//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
    		//商户订单号
    		$out_trade_no = $_POST['out_trade_no'];
    		//支付宝交易号
    		$trade_no = $_POST['trade_no'];
    		//交易状态
    		$trade_status = $_POST['trade_status'];
    		if($_POST['trade_status'] == 'TRADE_FINISHED') {
    			//判断该笔订单是否在商户网站中已经做过处理
    			//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
    			//如果有做过处理，不执行商户的业务程序
    			//注意：
    			//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
    			//调试用，写文本函数记录程序运行情况是否正常
    			//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
    		}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
    			//判断该笔订单是否在商户网站中已经做过处理
    			//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
    			//如果有做过处理，不执行商户的业务程序
    			//注意：
    			//付款完成后，支付宝系统发送该交易状态通知
    	
    			//调试用，写文本函数记录程序运行情况是否正常
    			//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
    			$R = M("order");
    			$condition['order_num'] = $_REQUEST['out_trade_no'];
    			$Info = $R->join('hx_user u on hx_order.user_id=u.user_id')->field('u.open_id,hx_order.*')->where($condition)->find();
    			if($Info['open_id']&&$Info['pay_type']==0){
                    log::write("支付推送3 pay_alipay_notify");
    				$url = 'http://wechat.99qby.com/app/index.php?i=4&c=entry&do=index2&m=we7_demo&open_id='.$Info['open_id'].'&type=3&num='.$Info['order_num'].'&id='.$Info['order_id'].'&money='.$Info['all_price'];
    				$this->https_request($url);
    			}
    			if($Info['pay_type']==0){
    				$datamoney['order_id'] = $Info['order_id'];
    				$datamoney['pay_type'] = 1;
    				$res = $R->save($datamoney);
    				/* //支付日志
    				$tdata['order_id'] = $Info['order_id'];
    				$tdata['action'] = 'PAY';
    				$tdata['name'] = '用户支付';
    				$tdata['time'] = time();
    				M('order_log')->add($tdata); */
    				//未激活免单 激活
    				$mianDan = M('coupon_user')->where('c_id=4 and status=2 and user_id='.$Info['user_id'])->find();
    				if($mianDan){
    					$Dan['cu_id'] = $mianDan['cu_id'];
    					$Dan['status'] = 1;
    					$Dan['rand_money'] = $Info['all_price'];
    					M('coupon_user')->save($Dan);
    				}
    			}
    		}
    		//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
    		echo "success";		//请不要修改或删除
    	}else {
    		//验证失败
    		echo "fail";
    		//调试用，写文本函数记录程序运行情况是否正常
    		//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
    	}
    }
    
    
    //支付宝支付通知
    public function alipay_notify_wap()
    {
    	require_once("./payment/alipay/wap/alipay.config.php");
    	require_once("./payment/alipay/wap/lib/alipay_notify.class.php");
    	//计算得出通知验证结果
    	$alipayNotify = new AlipayNotify($alipay_config);
    	$verify_result = $alipayNotify->verifyNotify();
    	if($verify_result) {//验证成功
    		//请在这里加上商户的业务逻辑程序代
    		//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
    		//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
    		//解析notify_data
    		//注意：该功能PHP5环境及以上支持，需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
    		$doc = new DOMDocument();
    		if ($alipay_config['sign_type'] == 'MD5') {
    			$doc->loadXML($_POST['notify_data']);
    		}
    		if ($alipay_config['sign_type'] == '0001') {
    			$doc->loadXML($alipayNotify->decrypt($_POST['notify_data']));
    		}

    		if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {
    			//商户订单号
    			$out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue;
    			//支付宝交易号
    			$trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue;
    			//交易状态
    			$trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue;
    	
    			if($trade_status == 'TRADE_FINISHED') {
    				//判断该笔订单是否在商户网站中已经做过处理
    				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
    				//如果有做过处理，不执行商户的业务程序
    				//注意：
    				//该种交易状态只在两种情况下出现
    				//1、开通了普通即时到账，买家付款成功后。
    				//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
    				//调试用，写文本函数记录程序运行情况是否正常
    				//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
    				echo "success";		//请不要修改或删除
    			}else if ($trade_status == 'TRADE_SUCCESS') {
    				//判断该笔订单是否在商户网站中已经做过处理
    				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
    				//如果有做过处理，不执行商户的业务程序
    				//注意：
    				//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
    				//调试用，写文本函数记录程序运行情况是否正常
    				//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
    				$R = M("order");
    				$condition['order_num'] = $out_trade_no;
    				$Info = $R->join('hx_user u on hx_order.user_id=u.user_id')->field('u.open_id,hx_order.*')->where($condition)->find();
    				if($Info['open_id']){
                        log::write("支付推送4 pay_alipay_notify_wap");
    					$url = 'http://wechat.99qby.com/app/index.php?i=4&c=entry&do=index2&m=we7_demo&open_id='.$Info['open_id'].'&type=3&num='.$Info['order_num'].'&id='.$Info['order_id'].'&money='.$Info['all_price'];
    					$this->https_request($url);
    				}
    				if($Info['pay_type']==0){
    					$datamoney['order_id'] = $Info['order_id'];
    					$datamoney['pay_type'] = 1;
    					$res = $R->save($datamoney);
    					/* //支付日志
    					$tdata['order_id'] = $Info['order_id'];
    					$tdata['action'] = 'PAY';
    					$tdata['name'] = '用户支付';
    					$tdata['time'] = time();
    					M('order_log')->add($tdata); */
    					//未激活免单 激活
    					$mianDan = M('coupon_user')->where('c_id=4 and status=2 and user_id='.$Info['user_id'])->find();
    					if($mianDan){
	    					$Dan['cu_id'] = $mianDan['cu_id'];
	    					$Dan['status'] = 1;
	    					$Dan['rand_money'] = $Info['all_price'];
	    					M('coupon_user')->save($Dan);
	    				}
    				}
    				echo "success";		//请不要修改或删除
    			}
    		}
    		//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
    	}else {
    		//验证失败
    		echo "fail";
    		//调试用，写文本函数记录程序运行情况是否正常
    		//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
    	}
    }
    
    //支付宝支付
    public function alipay($order_id=null)
    {
    	vendor('alipay/alipay_submit');
    	vendor('alipay/alipay_core');
    	vendor('alipay/alipay_md5');
    	if(empty($order_id)){
    		$order_id = $_REQUEST['order_id'];
    	}
    	$Info = M('order')->where("order_id=".$order_id)->find();
    	$alipay_config = $this->alipayConfig();
    	//支付类型
    	$payment_type = "1";
    	//必填，不能修改
    	//服务器异步通知页面路径
    	$notify_url = "http://wap.99qby.com/pay/alipay_notify";
    	//需http://格式的完整路径，不能加?id=123这类自定义参数
    	//页面跳转同步通知页面路径
    	$return_url = "http://wap.99qby.com/payment/alipay/return_url.php";
    	//需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
    	//商户订单号
    	$out_trade_no = $Info['order_num'];
    	//商户网站订单系统中唯一订单号，必填
    	//订单名称
    	$subject = $Info['order_name'];
    	//必填
    	//付款金额
    	$total_fee = $Info['all_price'];
    	if($Info['user_id']==208){
    		$total_fee = 0.01;
    	}
    	//必填
    	//订单描述
    	$body = $Info['order_name'];
    	//商品展示地址
    	$show_url = 'http://wap.99qby.com/';
    	//需以http://开头的完整路径，例如：http://www.商户网址.com/myorder.html
    	//防钓鱼时间戳
    	$anti_phishing_key = "";
    	//若要使用请调用类文件submit中的query_timestamp函数
    	//客户端的IP地址
    	$exter_invoke_ip = "";
    	//非局域网的外网IP地址，如：221.0.0.1
    	//构造要请求的参数数组，无需改动
    	$parameter = array(
    			"service" => "create_direct_pay_by_user",
    			"partner" => trim($alipay_config['partner']),
    			"seller_email" => trim($alipay_config['seller_email']),
    			"payment_type"	=> $payment_type,
    			"notify_url"	=> $notify_url,
    			"return_url"	=> $return_url,
    			"out_trade_no"	=> $out_trade_no,
    			"subject"	=> $subject,
    			"total_fee"	=> $total_fee,
    			"body"	=> $body,
    			"show_url"	=> $show_url,
    			"anti_phishing_key"	=> $anti_phishing_key,
    			"exter_invoke_ip"	=> $exter_invoke_ip,
    			"qr_pay_mode"	=> 1,
    			"_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
    	);
    	//建立请求
    	$alipaySubmit = new AlipaySubmit($alipay_config);
    	$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
    	echo $html_text;
    }
    
    //二维码
    public function code()
    {
    	vendor("phpqrcode.phpqrcode");
    	// 纠错级别：L、M、Q、H
    	$level = 'H';
    	// 点的大小：1到10,用于手机端4就可以了
    	$size = 10;
    	// 下面注释了把二维码图片保存到本地的代码,如果要保存图片,用$fileName替换第二个参数false
    	//$path = "images/";
    	// 生成的文件名
    	//$fileName = $path.$size.'.png';
    	$map['type_id'] = 1;
    	$map['code'] = array('neq','');
    	$P = M('peijian');
    	$list = $P->field("pj_id,code")->where($map)->select();
    	/* echo $P->getLastsql();
    	echo count($list);exit; */
    	/*
    	$qrcode = M('qrcode');
    	for($i=0;$i<40;$i++){
    		for($j=0;$j<125;$j++){
    			$path = "Uploads/" . date("Ymd") . "/";
    			$data = array();
    			$data['qrcode'] = rand('10000', '99999').rand('10000', '99999').rand('100000', '999999');
    			if($list[$i]['pj_id']){
    				$data['pj_id'] = $list[$i]['pj_id'];
    				$data['code'] = $list[$i]['code'];
    				$path .= $list[$i]['pj_id'] . "/";
    				if (!is_dir($path)){
    					mkdir($path);
    				}
    			}else{
    				$data['pj_id'] = $i;
    				$path .= $i . "/";
    				if (!is_dir($path)){
    					mkdir($path);
    				}
    			}
    			$qrcode->add($data);
    			$fileName = $path.$data['qrcode'].'.png';
    			QRcode::png($data['qrcode'], $fileName, $level, $size,1);
    			//echo "<img src='http://test.99qby.com/".$fileName."' />";
    		}
    	} */
    }
    
    private function https_request($url,$data = null)
    {
    	$curl = curl_init();
    	curl_setopt($curl, CURLOPT_URL, $url);
    	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 40);
    	curl_setopt($ch, CURLOPT_TIMEOUT, 40);
    	if (!empty($data)){
    		curl_setopt($curl, CURLOPT_POST, 1);
    		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    	}
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    	$output = curl_exec($curl);
    	curl_close($curl);
    	return $output;
    }    
    
    private function alipayConfig(){
    	$alipay_config = array();
    	$alipay_config['partner']		= '2088611901720311';
    	$alipay_config['seller_email']	= 'lq@haixiuyizhan.com';
    	$alipay_config['key']			= '5joc6c4nzazo6b099sra6dhfg1sxo7r5';
    	$alipay_config['sign_type']    = strtoupper('MD5');
    	$alipay_config['input_charset']= strtolower('utf-8');
    	$alipay_config['cacert']    = getcwd().'\\cacert.pem';
    	$alipay_config['transport']    = 'http';
    	return $alipay_config;
    }

}